{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c982abca",
   "metadata": {},
   "source": [
    "# Interpretation 3B: KAN Compiler for hidden variables\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b9ec6c4",
   "metadata": {},
   "source": [
    "We have always assumed that the input and output variables are physical variables, but this might not be the case for raw data. For example, when we are given an image of a Gaussian bump, what's physical is the x and y coordinates of the Gaussian bump center, but the raw data is the pixels of the image. So we want to learn a physical parameter extractor that transforms images to physical parameters, and then perform some computations on the physical parameters to make the prediction."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "746a1c6a",
   "metadata": {},
   "source": [
    "construct dataset "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "12ef9e94",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f82dc6b4af0>"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "sigma = 0.1\n",
    "x0 = 0.8\n",
    "y0 = 0.\n",
    "N_pixel = 21\n",
    "\n",
    "x = y = torch.linspace(-1,1,steps=N_pixel)\n",
    "X, Y = torch.meshgrid(x, y)\n",
    "Z = 1/sigma * torch.exp(-((X-x0)**2+(Y-y0)**2)/(2*sigma**2)).detach().numpy()\n",
    "plt.matshow(Z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "8b9a7456",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f82dc72b400>"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaMAAAGkCAYAAACckEpMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAWtklEQVR4nO3dbYhd9b3o8d/O0zbayVxyY+bhOgmDRFqMBBptNPgwCs51LgQ1FrReJEIriokQBrFVXziUkrSCQbipFn1hFbT6Ro3QgE5PdKIEe6IoShCJOJLxmjlTc+1MjLpjknVftJlzponRZNb2lz35fGCjs/bOf/9cLvy6Zj+sSlEURQBAomnZAwCAGAGQTowASCdGAKQTIwDSiREA6cQIgHRiBEA6MQIgnRgBkK4hY/TQQw9FZ2dnnHbaabF06dJ49dVXs0eaMvr6+qJSqUy4tba2Zo/VsLZu3RorVqyI9vb2qFQq8fzzz0+4vyiK6Ovri/b29pg9e3Z0dXXFjh07coZtUN+2j2+++eYjjukLL7wwZ9gGtH79+rjggguiqakp5s+fH9dcc028//77Ex5TxnHccDF65plnYu3atXHvvffGW2+9FZdcckn09PTErl27skebMs4999zYvXv3+O3dd9/NHqlh7du3L5YsWRIbN2486v33339/bNiwITZu3Bjbt2+P1tbWuPLKK2Pv3r3f86SN69v2cUTEVVddNeGY3rx58/c4YWMbGBiI1atXx+uvvx79/f1x4MCB6O7ujn379o0/ppTjuGgwP/nJT4rbbrttwrYf/vCHxa9+9aukiaaW++67r1iyZEn2GFNSRBTPPffc+M+HDh0qWltbi9/+9rfj27766quiubm5+MMf/pAwYeP7131cFEWxatWq4uqrr06ZZyoaGRkpIqIYGBgoiqK847ihzoz2798fb775ZnR3d0/Y3t3dHdu2bUuaaurZuXNntLe3R2dnZ9xwww3x4YcfZo80JQ0ODsbw8PCE47larcZll13meC7ZK6+8EvPnz49zzjknbrnllhgZGckeqWGNjo5GRMTcuXMjorzjuKFi9Omnn8bBgwejpaVlwvaWlpYYHh5OmmpqWbZsWTzxxBPx4osvxqOPPhrDw8OxfPny2LNnT/ZoU87hY9bxXF89PT3x5JNPxpYtW+KBBx6I7du3xxVXXBG1Wi17tIZTFEX09vbGxRdfHIsXL46I8o7jGeWN+f2pVCoTfi6K4ohtnJienp7xvz/vvPPioosuirPPPjsef/zx6O3tTZxs6nI819f1118//veLFy+O888/PxYuXBh//vOfY+XKlYmTNZ41a9bEO++8E6+99toR9032OG6oM6N58+bF9OnTj6jtyMjIEVWmHGeccUacd955sXPnzuxRppzD71J0PH+/2traYuHChY7p43THHXfECy+8EC+//HKcddZZ49vLOo4bKkazZs2KpUuXRn9//4Tt/f39sXz58qSpprZarRbvvfdetLW1ZY8y5XR2dkZra+uE43n//v0xMDDgeK6jPXv2xNDQkGP6OyqKItasWRPPPvtsbNmyJTo7OyfcX9Zx3HC/puvt7Y2bbropzj///LjooovikUceiV27dsVtt92WPdqUcOedd8aKFStiwYIFMTIyEr/5zW9ibGwsVq1alT1aQ/r888/jgw8+GP95cHAw3n777Zg7d24sWLAg1q5dG+vWrYtFixbFokWLYt26dXH66afHjTfemDh1YznWPp47d2709fXFddddF21tbfHRRx/FPffcE/PmzYtrr702cerGsXr16njqqadi06ZN0dTUNH4G1NzcHLNnz45KpVLOcVzmW/6+L7///e+LhQsXFrNmzSp+/OMfj7/FkMm7/vrri7a2tmLmzJlFe3t7sXLlymLHjh3ZYzWsl19+uYiII26rVq0qiuIfb4u97777itbW1qJarRaXXnpp8e677+YO3WCOtY+/+OKLoru7uzjzzDOLmTNnFgsWLChWrVpV7Nq1K3vshnG0fRsRxWOPPTb+mDKO48o/nwwA0jTUa0YATE1iBEA6MQIgnRgBkE6MAEgnRgCka8gY1Wq16Ovr80WHdWQf15f9W3/2cf2VuY8b8nNGY2Nj0dzcHKOjozFnzpzscaYk+7i+7N/6s4/rr8x93JBnRgBMLWIEQLqT7otSDx06FJ988kk0NTV947UwxsbGJvyV8tnH9WX/1p99XH/fto+Looi9e/dGe3t7TJt27HOfk+41o48//jg6OjqyxwCgJENDQxOugXQ0J92ZUVNTU0REXBz/K2bEzORpADhRB+LreC02j/93/VhOuhgd/tXcjJgZMypiBNCw/vl7t+9y+XFvYAAgnRgBkK5uMXrooYeis7MzTjvttFi6dGm8+uqr9XoqABpcXWL0zDPP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\n",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_sample = 10000\n",
    "x0 = torch.rand(n_sample,) * 1.2 - 0.6\n",
    "y0 = torch.rand(n_sample,) * 1.2 - 0.6\n",
    "sigma = torch.rand(n_sample,) * 0.2 + 0.1\n",
    "x0 = x0[:, None, None]\n",
    "y0 = y0[:, None, None]\n",
    "sigma = sigma[:, None, None]\n",
    "\n",
    "x = y = torch.linspace(-1,1,steps=N_pixel)\n",
    "X, Y = torch.meshgrid(x, y)\n",
    "X = X[None, :, :]\n",
    "Y = Y[None, :, :]\n",
    "\n",
    "Z = 1/sigma * torch.exp(-((X-x0)**2+(Y-y0)**2)/(2*sigma**2))\n",
    "plt.matshow(Z[9,:,:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "8d336cd9",
   "metadata": {},
   "outputs": [],
   "source": [
    "inputs = Z.reshape(n_sample, -1)\n",
    "labels = (torch.sin(torch.pi*x0)+y0**2)[:,:,0]\n",
    "\n",
    "num = inputs.shape[0]\n",
    "ratio = 0.8\n",
    "train_num = int(num*ratio)\n",
    "train_id = np.random.choice(num, train_num, replace=False)\n",
    "test_id = list(set(range(num)) - set(train_id))\n",
    "\n",
    "dataset = {}\n",
    "dataset['train_input'] = inputs[train_id]\n",
    "dataset['test_input'] = inputs[test_id]\n",
    "dataset['train_label'] = labels[train_id]\n",
    "dataset['test_label'] = labels[test_id]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "d8f94f0f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.1\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 500x200 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from kan import *\n",
    "from kan.models import AutoEncoder\n",
    "from kan.compiler import kanpiler\n",
    "from sympy import *\n",
    "from kan.utils import create_dataset\n",
    "import torch\n",
    "\n",
    "input_variables = x,y = symbols('x y')\n",
    "expr = sin(pi*x)+y**2 #+ 0.01 * sin(2*pi*x) * sin(2*pi*y)\n",
    "\n",
    "decoder = kanpiler(input_variables, expr, grid=5)\n",
    "\n",
    "x = torch.rand(100,2) * 2 - 1\n",
    "decoder.get_act(x)\n",
    "\n",
    "#decoder.symbolic_fun[0].affine.requires_grad_(False)\n",
    "#decoder.symbolic_fun[1].affine.requires_grad_(False)\n",
    "\n",
    "decoder.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "4f688c14",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "checkpoint directory created: ./model\n",
      "saving model version 0.0\n"
     ]
    }
   ],
   "source": [
    "model = AutoEncoder(enc_type='mlp', dec_type='kan', width_enc=[N_pixel**2,10,2], width_dec=decoder.width)\n",
    "model.decoder = decoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "4d23c1cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| train_loss: 2.13e-02 | test_loss: 2.49e-02 | reg: 1.82e+02 | : 100%|█| 100/100 [01:47<00:00,  1.07"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "saving model version 0.1\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "model.fit(dataset, steps=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "ebf3e789",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7f8268071040>"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(y0[train_id], model.encoder(dataset['train_input'])[:,1].detach().numpy())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "49839322",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "eb92c6bf",
   "metadata": {},
   "outputs": [],
   "source": [
    "weight = model.encoder.linears[0].weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "a8198183",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f82982cf6d0>"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.matshow(weight[0].reshape(N_pixel,N_pixel).detach().numpy())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "15fb458e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7f82c8924d90>"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaMAAAGkCAYAAACckEpMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAeyklEQVR4nO3dbWyc9dXn8d/4afzAeBLHicduHNd3G0pLsumS0ISIh4CKhbWKCqG7oayQkVoESoKUjRBqiLRYVZVUSESslEIF0tKwIi1vKCCBCu4GHNps2pAlC3dKaXLj3HFIjIlJPI4Tj+2Za1/QWHITIOZ/huOZfD/SCOYhZ878r2vm58uemROLoigSAACOSrwbAACAMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4K8gwevzxx9Xa2qrKykotXrxYb775pndLRaOzs1OxWGzSKZVKebdVsHbt2qWVK1eqqalJsVhML7zwwqTroyhSZ2enmpqaVFVVpRUrVujAgQM+zRaoL1rju++++7x9etmyZT7NFqAtW7bo6quvViKR0Jw5c3Trrbfq/fffn3Qbi/244MLoueee0/r167Vp0ya9/fbbuu6669Te3q4jR454t1Y0rrzySh0/fnzi9O6773q3VLCGh4e1aNEibdu27YLXP/LII9q6dau2bdumvXv3KpVK6eabb9bQ0NBX3Gnh+qI1lqRbbrll0j79yiuvfIUdFrbu7m6tXbtWe/bsUVdXl8bHx9XW1qbh4eGJ25jsx1GB+d73vhfdd999ky674oorop/+9KdOHRWXhx9+OFq0aJF3G0VJUvS73/1u4nwul4tSqVT0i1/8YuKykZGRKJlMRr/61a8cOix8/7zGURRFHR0d0Q9+8AOXfopRf39/JCnq7u6OoshuPy6oI6PR0VHt27dPbW1tky5va2vT7t27nboqPgcPHlRTU5NaW1t1xx136IMPPvBuqSj19PSor69v0v4cj8d1ww03sD8be+ONNzRnzhxdfvnluueee9Tf3+/dUsEaHByUJNXV1Umy248LKoxOnDihbDarhoaGSZc3NDSor6/PqavisnTpUj3zzDN69dVX9dRTT6mvr0/Lly/XwMCAd2tF59w+y/6cX+3t7Xr22We1c+dOPfroo9q7d69uuukmZTIZ79YKThRF2rBhg6699lotWLBAkt1+XGbX5lcnFotNOh9F0XmX4ctpb2+f+P+FCxfqmmuu0Te+8Q1t375dGzZscOyseLE/59fq1asn/n/BggVasmSJWlpa9PLLL2vVqlWOnRWedevW6Z133tEf//jH864L3Y8L6siovr5epaWl56Vtf3//eakMGzU1NVq4cKEOHjzo3UrROfcuRfbnr1ZjY6NaWlrYp6fo/vvv10svvaTXX39dc+fOnbjcaj8uqDCqqKjQ4sWL1dXVNenyrq4uLV++3Kmr4pbJZPTee++psbHRu5Wi09raqlQqNWl/Hh0dVXd3N/tzHg0MDKi3t5d9+iJFUaR169bp+eef186dO9Xa2jrpeqv9uOB+TbdhwwbdddddWrJkia655ho9+eSTOnLkiO677z7v1orCAw88oJUrV2revHnq7+/Xz3/+c6XTaXV0dHi3VpBOnz6tQ4cOTZzv6enR/v37VVdXp3nz5mn9+vXavHmz5s+fr/nz52vz5s2qrq7WnXfe6dh1Yfm8Na6rq1NnZ6duv/12NTY26vDhw3rooYdUX1+v2267zbHrwrF27Vrt2LFDL774ohKJxMQRUDKZVFVVlWKxmM1+bPmWv6/KL3/5y6ilpSWqqKiIrrrqqom3GCLc6tWro8bGxqi8vDxqamqKVq1aFR04cMC7rYL1+uuvR5LOO3V0dERR9OnbYh9++OEolUpF8Xg8uv7666N3333Xt+kC83lrfObMmaitrS2aPXt2VF5eHs2bNy/q6OiIjhw54t12wbjQ2kqKnn766YnbWOzHsX/cGQAAbgrqb0YAgOJEGAEA3BFGAAB3hBEAwB1hBABwRxgBANwVZBhlMhl1dnbyRYd5xBrnF+ubf6xx/lmucUF+ziidTiuZTGpwcFC1tbXe7RQl1ji/WN/8Y43zz3KNC/LICABQXAgjAIC7afdFqblcTseOHVMikfjMWRjpdHrSf2GPNc4v1jf/WOP8+6I1jqJIQ0NDampqUknJ5x/7TLu/GR09elTNzc3ebQAAjPT29k6agXQh0+7IKJFISJJa/9t/V0m8MqhW/GR4P6dbc+FFJEUlNpkfldvUiX80fTZ95Sc2dbLx8BrDzdnwIpJiOZtJreWnbH6TnugN329GZto8JovtJEmlBm+SKxkLryFJozNs6pQP2dQZTYbXsOglOzqig0/+bOJ1/fNMn1ekfzj3q7mSeKVKA8Oo1GCnL6k0CqPS6RVGpfHps+lLK4wKWWzvKqMwytq8cJdW2oRRaUX4flMaNxqFbhVGBjW+4DdHF83itUaSSkeN6oS9dH5aw6gX6fyR5BfCGxgAAO4IIwCAu7yF0eOPP67W1lZVVlZq8eLFevPNN/N1VwCAApeXMHruuee0fv16bdq0SW+//bauu+46tbe368iRI/m4OwBAgctLGG3dulU//vGP9ZOf/ETf/va39dhjj6m5uVlPPPFEPu4OAFDgzMNodHRU+/btU1tb26TL29ratHv37vNun8lklE6nJ50AAJcW8zA6ceKEstmsGhoaJl3e0NCgvr6+826/ZcsWJZPJiRMfeAWAS0/e3sDwz+8rj6Logu8137hxowYHBydOvb29+WoJADBNmX/ysb6+XqWlpecdBfX39593tCRJ8Xhc8bjRJ8YAAAXJ/MiooqJCixcvVldX16TLu7q6tHz5cuu7AwAUgbx8J8yGDRt01113acmSJbrmmmv05JNP6siRI7rvvvvycXcAgAKXlzBavXq1BgYG9LOf/UzHjx/XggUL9Morr6ilpSUfdwcAKHB5+7bMNWvWaM2aNfkqDwAoInw3HQDAHWEEAHA3fYba/JNY7tNTiDNfC5/hYjaHyGguUsXHNpssWxn+uMpP28y3ieVs1jgzI7xGZDD3R5Ki0J33H8qO2/y8OHZZ+LYaqzVoRFJkNBbpTMt4cI2SMzbrW91nUycz06SMyofDa1hs7+zIxd+WIyMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7op6uN5YbTa4j/LB0uAaklR9yKbOqNGAs7FE+BC5sctsBtGVDdtMWysZC69RPdtgKpmk7L8mTerkjJ6hp+eFb6vxZPgwO0kqOWvzXCgdCq+Ti9sMQczZPCSToXhWYgbPp9gUdhmOjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO6m7aTXknGpJHB6Ylk6fPxiZBTXJWM2U1FLxm2mopaOhNeJnzRoRFL5aZu1KT8TXmOgsSa8iKSasyZlzCaIjs8Mn9JadbjcoBOput9me2dmhO/DUeiLzLk6RttpZJbN2pRmwmvEcgbrO4Vh2xwZAQDcEUYAAHeEEQDAHWEEAHBHGAEA3BFGAAB3hBEAwB1hBABwRxgBANwRRgAAd4QRAMAdYQQAcEcYAQDcEUYAAHeEEQDAHWEEAHBHGAEA3E3fSa+Z8KQcrx8L7qO8JryGJJ1Mxk3qlH9iM1JyPJELrjFWazN1NqqwmW5ZMRD+s1XZkM36VhlNMx2cb1JGFR+FP9Xjp8L7kKShr9vUiUrC17hk1GYfjtlsbpXYvNyYTKgerwl/jciVX3wNjowAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADupu+k15xUkg0sMh6etbkPq4JrSFK50UTJsjNGkymz4WsT2QxFlTI2jyn+SXid9HdsRm0OfNfm57zKj2wWuXQ0vMaZRptxpmMGU4YlqfLj8LUxm6xqswsrU2+zNrHx8IbiH4fvw9nMxdfgyAgA4I4wAgC4I4wAAO4IIwCAO/Mw6uzsVCwWm3RKpVLWdwMAKCJ5eTfdlVdeqT/84Q8T50tLrd52BQAoRnkJo7KyMo6GAAAXLS9/Mzp48KCamprU2tqqO+64Qx988MFn3jaTySidTk86AQAuLeZhtHTpUj3zzDN69dVX9dRTT6mvr0/Lly/XwMDABW+/ZcsWJZPJiVNzc7N1SwCAac48jNrb23X77bdr4cKF+v73v6+XX35ZkrR9+/YL3n7jxo0aHBycOPX29lq3BACY5vL+dUA1NTVauHChDh48eMHr4/G44vF4vtsAAExjef+cUSaT0XvvvafGxsZ83xUAoECZh9EDDzyg7u5u9fT06M9//rN++MMfKp1Oq6Ojw/quAABFwvzXdEePHtWPfvQjnThxQrNnz9ayZcu0Z88etbS0WN8VAKBImIfRb3/7W+uSAIAix3fTAQDcTdvherFspFg2bJhX7d/CH95lx2yGXZ2tMymjk/9h3KTOZT3ha1P1sc2wtY9vMJj8Jql+f3lwjZHZNk+J+IDNtLWs0RtNT7eG7zfVR23WpmTc5uvByofCa4wmw2tIdgMDY1ZDOIfD6+Ti4c/vXHTxNTgyAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuJu2k17P1sdUWhk2rbDsbHgfkVFcD8+1qVM6w2Yq6tmG8Ac2MstmKuXl8z4yqTNwWXNwjbIr0gadSCPv15rUqe0xKaMz3wyfRJr8wGaa6fEVNnXGq8InxsZP2uzDuQqbOmNJm7XRmfB+Ljsc3kZ2Ci9XHBkBANwRRgAAd4QRAMAdYQQAcEcYAQDcEUYAAHeEEQDAHWEEAHBHGAEA3BFGAAB3hBEAwB1hBABwRxgBANwRRgAAd4QRAMAdYQQAcEcYAQDcTdtJr6MzcyqpCpt6mIlFwX0MzwsuIUkqS9tMgmz4XdykzkdLw2vUfGjzmE4dCJ/QKkllufDtnTmcMOhEmvFvJmU0/DWbNVYm/OfOsWqbXkpGbH4GLj8d3k+2wqARSRWnbNam7HT49FpJqv4o/LkwUmewvpmLr8GREQDAHWEEAHBHGAEA3BFGAAB3hBEAwB1hBABwRxgBANwRRgAAd4QRAMAdYQQAcEcYAQDcEUYAAHeEEQDAHWEEAHBHGAEA3BFGAAB303a4XlSZVVSZDaoRC/z3krTg68eCa0jS4ZMzTeqMvT/DpE7UMBJcIz3bZqDY3NRJkzq9/zY7uEZ1r81TIv3N8OFmkhSV2tSJjYX/3DluNFwvKg8bmnlObDy8Rmn4S4QkaXSGzXZK/t2kjMarbep8lTgyAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuJu2k14rj5WrNF4eVKNkNOzfS9LfPmwNriFJshmSqbFWm0K50dLgGqn/bbP7JPbYTMmc+93wtRn4tkEjkmTzkNS422YU6SdXhG+rsRqDRiQl/h6+70nSuEE/mZk2G2q82qZO+hs2z+/RWeHTdKPq8FG6ubOZi74tR0YAAHeEEQDAHWEEAHBHGAEA3E05jHbt2qWVK1eqqalJsVhML7zwwqTroyhSZ2enmpqaVFVVpRUrVujAgQNW/QIAitCUw2h4eFiLFi3Stm3bLnj9I488oq1bt2rbtm3au3evUqmUbr75Zg0NDQU3CwAoTlN+v2d7e7va29sveF0URXrssce0adMmrVq1SpK0fft2NTQ0aMeOHbr33nvDugUAFCXTvxn19PSor69PbW1tE5fF43HdcMMN2r179wX/TSaTUTqdnnQCAFxaTMOor69PktTQ0DDp8oaGhonr/tmWLVuUTCYnTs3NzZYtAQAKQF7eTReLTf4UcRRF5112zsaNGzU4ODhx6u3tzUdLAIBpzPTrgFKplKRPj5AaGxsnLu/v7z/vaOmceDyueDxu2QYAoMCYHhm1trYqlUqpq6tr4rLR0VF1d3dr+fLllncFACgiUz4yOn36tA4dOjRxvqenR/v371ddXZ3mzZun9evXa/PmzZo/f77mz5+vzZs3q7q6Wnfeeadp4wCA4jHlMHrrrbd04403TpzfsGGDJKmjo0O//vWv9eCDD+rs2bNas2aNTp48qaVLl+q1115TIpGw6xoAUFSmHEYrVqxQFH3216XHYjF1dnaqs7MzpC8AwCWE76YDALgjjAAA7qbtpNdkT06l5WHTCnNl4VMTZ/+/8GmHkk0vknTqm1abrCK4wvidJwz6kErvHTGpM34mvJ+zvXUGnUh1+2y207H/PGZSJ145HFyj8rVag06kTxbbPKdio+E/S8f7babORjZlNDozfEKrJJNJw/Ga0eAa2djF1+DICADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4G7aTnod+lqJSuNhWVliMCRzZGZ5eBFJw3MNRi9KyiZspmTW/yV8NGXJB7MMOpF6a+tN6kQGw3TnHs2GF5F08ls2k33L/15lUqdiILzOJ98Ln/wpSZW94VOGJSlbEf6cqrQZVqwzNi8Tqj5uMzJ26OvhE2NHz4Rvp9zZi++DIyMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7qbtcL2zqZxKqgIHRCXDp+uVVNgMW9OxSpMyte/bbLJPFoQP38pVhteQpMQhm8d0tiF82FosZzPc7Ir/9HeTOv/3nW+Y1Jn1r+E1Ti20GRg48282+81HS8NrnFpkM6xSZTbDM+OnbAYPzvxr+LY6dUX4xMDYyMW/fnJkBABwRxgBANwRRgAAd4QRAMAdYQQAcEcYAQDcEUYAAHeEEQDAHWEEAHBHGAEA3BFGAAB3hBEAwB1hBABwRxgBANwRRgAAd4QRAMAdYQQAcDdtJ72W1I+opDqsRnYwfGpi+eF4cA1JKh0xKaOqfpspmenvhE+wnbE/fBKkJI3Um5RR1bdOhRf595nhNST1/Q+bCa01/3XIpM7gv8wIrhGfeSa8EUknFl1mUicXD9+Hq3pt9uHIZkCwSsKHU3/KYPBsZX/4sUo2c/E1ODICALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4m7aTXrNnyxQFtpc4FP7w4p8YjEyUdGLZuEmdsRqbTTbrL+F1cmU2a1N2JmZSp/Z/1QbX+Pi/nDboRKp/3Gb053h81KRO6eHwqaif1CQMOpEq0yZllDgcvsaD37TZh0vCl1eSlInZPBfiA+F1yg2eCiWZKdw2/O4AAAhDGAEA3BFGAAB3hBEAwN2Uw2jXrl1auXKlmpqaFIvF9MILL0y6/u6771YsFpt0WrZsmVW/AIAiNOUwGh4e1qJFi7Rt27bPvM0tt9yi48ePT5xeeeWVoCYBAMVtyu/vbW9vV3t7++feJh6PK5VKfemmAACXlrz8zeiNN97QnDlzdPnll+uee+5Rf3//Z942k8konU5POgEALi3mYdTe3q5nn31WO3fu1KOPPqq9e/fqpptuUiZz4U8/bdmyRclkcuLU3Nxs3RIAYJoz/waG1atXT/z/ggULtGTJErW0tOjll1/WqlWrzrv9xo0btWHDhonz6XSaQAKAS0zevw6osbFRLS0tOnjw4AWvj8fjisfj+W4DADCN5f1zRgMDA+rt7VVjY2O+7woAUKCmfGR0+vRpHTp0aOJ8T0+P9u/fr7q6OtXV1amzs1O33367GhsbdfjwYT300EOqr6/XbbfdZto4AKB4TDmM3nrrLd14440T58/9vaejo0NPPPGE3n33XT3zzDM6deqUGhsbdeONN+q5555TImHzjb8AgOIz5TBasWKFouizv3b91VdfDWoIAHDp4bvpAADupu1wvfiHFSqtrAiqkejNGXVjILIZmpULW5IJI7PC+ylZdtKgE2n03RkmdSKDH62yWZufz0Zm2WyonNF+M9xiMOzvyqHwGpKGP6wxqRMzGGh3+VVHwotIOvyHr5vUKR82KaMzXwsfGljZH77v5abwEsyREQDAHWEEAHBHGAEA3BFGAAB3hBEAwB1hBABwRxgBANwRRgAAd4QRAMAdYQQAcEcYAQDcEUYAAHeEEQDAHWEEAHBHGAEA3BFGAAB3hBEAwN20nfQaxcKHo45eZjCp0GiFKo/ZFEr9ZcykTq4sfG36amaENyIpKjcpo2O3hI/+rDpQbdCJVPXRGZM6xwdtpqLO+ih88mf/qUqDTqRYeXgvkpT6U3iNoT81hxeRVFtlM1X6xH80KaPsrPDXiSgWPq04N3Lx25ojIwCAO8IIAOCOMAIAuCOMAADuCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4I4wAAO4IIwCAO8IIAOCOMAIAuCOMAADuCCMAgLtpO+k1lpNigYM7T88Ln2YaOm12ok6pzXTLw6tMyqiqLnwSaU2FzdTZs/tmmdSp/T/hI2MzM8L7kKTaXxw1qXN30qbOn37x3eAas94Kn6QrSe/fa7O9Yz/uD65x9IhNL/EZIyZ1skNxkzoaDT/OyFaHT6/NxS6+BkdGAAB3hBEAwB1hBABwRxgBANwRRgAAd4QRAMAdYQQAcEcYAQDcEUYAAHeEEQDAHWEEAHBHGAEA3BFGAAB3hBEAwB1hBABwRxgBANwRRgAAd9N20qtiCo7KilMWjdhIX24zJXPht3pN6lSWhk9p3fu3VoNOpH95M2NSp2znvuAa/euWG3QiXZW02U43XfZXkzqvfGdFcI3Eb/eENyKpqbvOpM7x2cngGuW1Nvve2KjRS+m4zWjp8oHwfrJV4dOpY9mLfzwcGQEA3BFGAAB3hBEAwB1hBABwRxgBANwRRgAAd4QRAMAdYQQAcEcYAQDcEUYAAHeEEQDAHWEEAHBHGAEA3BFGAAB3hBEAwB1hBABwN22H65WOSKWBs51KxsP7GK0NryFJNf9us9QHMl83qVN2OnyI19y3cwadSJV/PWxSJ5oRPmyt8hObx5QoHTGps6yy1KTO+F0DwTXOZJYadCJddnDQpE7L/6wJrjFwZZVBJ1Jks5mUM3pFzlaG1yg3eI3IZi7+eIcjIwCAO8IIAOCOMAIAuCOMAADuphRGW7Zs0dVXX61EIqE5c+bo1ltv1fvvvz/pNlEUqbOzU01NTaqqqtKKFSt04MAB06YBAMVlSmHU3d2ttWvXas+ePerq6tL4+Lja2to0PDw8cZtHHnlEW7du1bZt27R3716lUindfPPNGhoaMm8eAFAcpvRGwt///veTzj/99NOaM2eO9u3bp+uvv15RFOmxxx7Tpk2btGrVKknS9u3b1dDQoB07dujee++16xwAUDSC/mY0OPjp5wXq6uokST09Perr61NbW9vEbeLxuG644Qbt3r37gjUymYzS6fSkEwDg0vKlwyiKIm3YsEHXXnutFixYIEnq6+uTJDU0NEy6bUNDw8R1/2zLli1KJpMTp+bm5i/bEgCgQH3pMFq3bp3eeecd/eY3vznvulhs8id3oyg677JzNm7cqMHBwYlTb2/vl20JAFCgvtSXT9x///166aWXtGvXLs2dO3fi8lQqJenTI6TGxsaJy/v7+887WjonHo8rHo9/mTYAAEViSkdGURRp3bp1ev7557Vz5061trZOur61tVWpVEpdXV0Tl42Ojqq7u1vLly+36RgAUHSmdGS0du1a7dixQy+++KISicTE34GSyaSqqqoUi8W0fv16bd68WfPnz9f8+fO1efNmVVdX684778zLAwAAFL4phdETTzwhSVqxYsWky59++mndfffdkqQHH3xQZ8+e1Zo1a3Ty5EktXbpUr732mhKJhEnDAIDiM6UwiqIvnukQi8XU2dmpzs7OL9sTAOASw3fTAQDcTbvheueOvrKZ8OFkJaPBJZTNhNeQpFjWpk5uxGb4W24kfHDW+JhNL+M5gw0lKYrC62THbIbijZw2mOwoKV1ms8bZM+E78rjR2owbPanGx8Mn2mUzgRM8/8FsuJ7R60Q2/Olt8pp17nX8on6rFl3Mrb5CR48e5YOvAFBEent7J30M6EKmXRjlcjkdO3ZMiUTiMz8om06n1dzcrN7eXtXWGs0FxySscX6xvvnHGuffF61xFEUaGhpSU1OTSko+/69C0+7XdCUlJV+YoOfU1tayk+UZa5xfrG/+scb593lrnEwmL6oGb2AAALgjjAAA7goyjOLxuB5++GG+0y6PWOP8Yn3zjzXOP8s1nnZvYAAAXHoK8sgIAFBcCCMAgDvCCADgjjACALgjjAAA7ggjAIA7wggA4I4wAgC4+//5+yCz9v5u5gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 480x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.matshow(weight[1].reshape(N_pixel,N_pixel).detach().numpy())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "319f269e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 500x200 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "decoder.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5f325e8a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
